

// union Data8to1
// {
// 	char in8;
// 	bool out[8];
// }act8to1;
typedef struct DDR
{
    unsigned int ddr32[4];
} DDR128;


// union Data1to128{
//     bool in[128];
//     DDR128 out;
// }ddr1to128;




static void act_datatransfer(int TEST_NUM,  int CIM_COL, char act_data_ori[4][4][128], DDR128 *ddr128)//[4][4][128]
{
    unsigned int offset = 0;
    int i , j ,m ,b;
    for ( i = 0; i < TEST_NUM; i++) {
        for ( m = 0; m < 8; m++){
            for ( j = 0; j < CIM_COL; j=j+1){
                unsigned int ddr32[4] = {0, 0, 0 , 0};
                for ( b = 0; b < 128; b++){
                    int index = (int) (b / 32);
                    ddr32[index] = ddr32[index]  | (( ((unsigned char)(act_data_ori[i][j][b]>>m)) & 0x1 ) << (b-32*index) );
                }
                // printf("[DEBUG-2:] ddr1to128.out = %08x%08x%08x%08x\n", ddr1to128.out.ddr32[3], ddr1to128.out.ddr32[2], ddr1to128.out.ddr32[1], ddr1to128.out.ddr32[0]);
                ddr128[offset].ddr32[0] = ddr32[0];
                ddr128[offset].ddr32[1] = ddr32[1];
                ddr128[offset].ddr32[2] = ddr32[2];
                ddr128[offset].ddr32[3] = ddr32[3];
                offset = offset + 1;
            }
        }
    }
}
// static void act_datatransfer(int TEST_NUM,  int CIM_COL, char act_data_ori[4][4][128], DDR128 *ddr128)//[4][4][128]
// {
//     unsigned int offset = 0;
//     int i , j ,m ,b;
//     for ( i = 0; i < TEST_NUM; i++) {
//         for ( j = 0; j < CIM_COL; j=j+1){
//             for ( m = 0; m < 8; m++){
//                 unsigned int ddr32[4] = {0, 0, 0 , 0};
//                 for ( b = 0; b < 128; b++){
//                     int index = (int) (b / 32);
//                     ddr32[index] = ddr32[index]  | (( ((unsigned int)(act_data_ori[i][j][b]>>m)) & 0x1 ) << (b-32*index) );
//                 }
//                 // printf("[DEBUG-2:] ddr1to128.out = %08x%08x%08x%08x\n", ddr1to128.out.ddr32[3], ddr1to128.out.ddr32[2], ddr1to128.out.ddr32[1], ddr1to128.out.ddr32[0]);
//                 ddr128[offset].ddr32[0] = ddr32[0];
//                 ddr128[offset].ddr32[1] = ddr32[1];
//                 ddr128[offset].ddr32[2] = ddr32[2];
//                 ddr128[offset].ddr32[3] = ddr32[3];
//                 offset = offset + 1;
//             }
//         }
//     }
// }

void wet_datatransfer(int CIM_ROW,  int CIM_COL, char wet_data_ori[16*12][128*4], DDR128 *ddr128)//[16*12][128*4]
{
    unsigned int offset = 0;
    int i , j ,m ,b ,k;
    for ( i = 0; i < CIM_ROW; i++) {
        for ( j = 0; j < CIM_COL; j++){
            for( m = 0;m < 16; m++) {
                for ( b = 0; b < 8; b++){    
                    unsigned int ddr32[4] = {0, 0, 0 , 0};           
                    for ( k = 0; k < 128; k++){
                        int index = (int) (k / 32);
                        ddr32[index] = ddr32[index]  | (( ((unsigned int)(wet_data_ori[i*16+m][128*j+k]>>b)) & 0x1 ) << (k-32*index) );
                    }
                    ddr128[offset].ddr32[0] = ddr32[0];
                    ddr128[offset].ddr32[1] = ddr32[1];
                    ddr128[offset].ddr32[2] = ddr32[2];
                    ddr128[offset].ddr32[3] = ddr32[3];
                    offset = offset + 1;
                }
            }
        }
    }
}




// void wet_datatransfer(int CIM_ROW,  int CIM_COL, char wet_data_ori[16*12][128*4], DDR128 *ddr128)//[16*12][128*4]
// {
//     unsigned int offset = 0;
//     int i , j ,m ,b ,k;
//     for ( i = 0; i < CIM_ROW; i++) {
//         for ( j = 0; j < CIM_COL; j++){
//             for( m = 0;m < 16; m++) {
//                 for ( b = 0; b < 8; b++){    
//                     unsigned int ddr32_0=0x0;
//                     unsigned int ddr32_1=0x0;
//                     unsigned int ddr32_2=0x0;
//                     unsigned int ddr32_3=0x0;            
//                     for ( k = 0; k < 128; k++){
//                         if(b==0){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x01  )<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x01  )<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x01  )<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x01  )<<(k-96)  );
//                         }
//                         if(b==1){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x02  )>>1<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x02  )>>1<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x02  )>>1<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x02  )>>1<<(k-96)  );
//                         }
//                         if(b==2){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x04  )>>2<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x04  )>>2<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x04  )>>2<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x04  )>>2<<(k-96)  );
//                         }
//                         if(b==3){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x08  )>>3<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x08  )>>3<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x08  )>>3<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x08  )>>3<<(k-96)  );
//                         }   
//                         if(b==4){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x10  )>>4<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x10  )>>4<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x10  )>>4<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x10  )>>4<<(k-96)  );
//                         }
//                         if(b==5){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x20  )>>5<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x20  )>>5<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x20  )>>5<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x20  )>>5<<(k-96)  );
//                         }    
//                         if(b==6){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x40  )>>6<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x40  )>>6<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x40  )>>6<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x40  )>>6<<(k-96)  );
//                         }  
//                         if(b==7){
//                             if(k<32)
//                                 ddr32_0 = ddr32_0 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x80  )>>7<<k  );
//                             else if(k<64)
//                                 ddr32_1 = ddr32_1 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x80  )>>7<<(k-32)  );
//                             else if(k<96)
//                                 ddr32_2 = ddr32_2 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x80  )>>7<<(k-64)  );
//                             else 
//                                 ddr32_3 = ddr32_3 |  ((  (unsigned int)(wet_data_ori[i*16+m][128*j+k])&0x80  )>>7<<(k-96)  );
//                         }                                                                                                                   
//                         // act8to1.in8 = wet_data_ori[i*16+m][128*j+k];
//                         // ddr1to128.in[k] = act8to1.out[b];
//                         // ddr128[offset] = ddr1to128.out;
                        
//                     }
//                     ddr128[offset].ddr32[0] = ddr32_0;
//                     ddr128[offset].ddr32[1] = ddr32_1;
//                     ddr128[offset].ddr32[2] = ddr32_2;
//                     ddr128[offset].ddr32[3] = ddr32_3;
//                     offset = offset + 1;
//                 }
//             }
//         }
//     }
// }
